import 'dart:math';

import 'package:acgn_pioneer/public.dart';

class StringUtil {
  /**
   * numberToUnitStr 数字转换单位字符串
   * @param  {Number} number 需要转换的字符
   * @return {String}        返回转换后的字符串
   *
   */
  static String numberToUnitStr(int number) {
    if (number >= 1e10) {
      // 1百亿及以上 显示为xxx亿，如：123亿（12345678901）
      return (number / 1e8).toStringAsFixed(0) + '亿';
    } else if (number >= 1e8) {
      // 1亿到1百亿 显示成xx.x亿，如：12.3亿（1234567890）
      return (number / 1e8).toStringAsFixed(2) + '亿';
    } else if (number >= 1e6) {
      // 100万到1亿之间显示成xxx万，如：1234万（12345678）
      return (number ~/ 1e4).toStringAsFixed(0) + '万';
    } else if (number >= 1e5) {
      // 10万到100万之间，显示成xx.x万，如：12.3万（123456
      return (number / 1e4).toStringAsFixed(1) + '万';
    }

    // 10万以内直接显示 如：12345
    return number.toString();
  }

  /**
   * @function exchangeRMB 转换
   * @params {int} totalScore
   * @params {int} rate
   * @return {String}
   */
  static String exchangeRMB(int totalScore, int rate) {
    return (totalScore / rate).toStringAsFixed(2);
  }

  /**
   * @function encodePhone
   * @params {dynamic} phone
   * @return {String}
   */
  static String encodePhone(dynamic phone, {start = 3, end = 7}) {
    int pad = max(end - start, 0);
    return (phone ?? '')
        .toString()
        .replaceRange(start, end, ''.padLeft(pad, '*'));
  }

  /**
   * [formatDate 格式化显示日期时间]
   * @param  {[String | Number]} date [待显示的日期时间，可以为数字形式]
   * @param  {[String]} fmt [需要显示的格式，例如yyyy-MM-dd hh:mm:ss]
   * @return {[String]}   [格式化好的时间]
   */
  static String formatDate(dynamic date, [String fmt = 'yyyy-MM-dd hh:mm:ss']) {
    DateTime _date;
    if (date.runtimeType == int) {
      _date = DateTime.fromMillisecondsSinceEpoch(date);
    } else if (date.runtimeType == String) {
      _date = DateTime.parse(date);
    }
    Map<String, int> o = {
      'y': _date.year,
      'M': _date.month + 1,
      'd': _date.day,
      'h': _date.hour,
      'm': _date.minute,
      's': _date.second,
      'w': _date.weekday // 当前星期
    };
    RegExp reg = new RegExp(r'y+|M+|d+|h+|m+|s+|w+');
    try {
      return fmt.replaceAllMapped(reg, (match) {
        String item = match.group(0);
        int len = item.length;
        String first = item.substring(0, 1);
        String fillZero = (len > 0 ? '0' : '') + o[first].toString();
        LogUtil.v('==formatDate===>item:$item, len:$len, fillZero:$fillZero');
        return fillZero.substring((fillZero.length > len && len > 0) ? 1 : 0);
      });
    } catch (e) {
      LogUtil.v(e);
      return '';
    }
  }

  /**
   * 1s = 1000ms
   * 1m = 60 * 1000ms
   * 1h = 60 * 60 * 1000
   * 1d = 24 * 60 * 60 * 1000
   *
   * [getTimeSpan 转换阶梯时间]
   * @param  {[Number]} date [时间戳]
   * @param  {[String]} fmt [需要显示的格式，例如yyyy-MM-dd hh:mm:ss]
   * @return {[String]}      [转换后的时间字符串]
   */
  static String getTimeSpan(dynamic date, [String fmt = 'yyyy-MM-dd']) {
    DateTime _date;
    if (date.runtimeType == int) {
      if (date.toString().length == 10) {
        date = date * 1000;
      }
      _date = DateTime.fromMillisecondsSinceEpoch(date);
    } else {
      _date = DateTime.parse(date);
    }
    int current = DateTime.now().millisecondsSinceEpoch;
    int timestamp = _date.millisecondsSinceEpoch;
    // 差值
    int differe = current - timestamp;

    if (differe > 0) {
      if (differe > 864e6) {
        // 10天前，显示mm.dd hh: mm（例：04.05 16:05）
        // return this.formatDate(timestamp, 'mm.dd hh:mm')
        return formatDate(timestamp, fmt);
      } else if (differe > 2592e5) {
        // 小于10天（含10天），显示x天前；
        return numberFloor(differe / 864e5) + '天前';
      } else if (differe > 1728e5) {
        // 2天到3天之前前天；
        return '前天';
      } else if (differe > 864e5) {
        // 1天到2天之间，显示昨天；
        return '昨天';
      } else if (differe > 36e5) {
        // 小于一天，显示x小时前；
        return numberFloor(differe / 36e5) + '小时前';
      } else if (differe > 6e4) {
        // 小于1小时，显示x分钟前；
        return numberFloor(differe / 6e4) + '分钟前';
      }

      // 小于1分钟，显示“刚刚”；
      return '刚刚';
    } else {
      return formatDate(timestamp, fmt);
    }
  }

  static String numberFloor(double number) {
    return number.floor().toString();
  }

  /**
   * @function formatImgSrc 格式化图片的url路径， 当不存在的时候返回comicid的封面图
   * @param {String} placeholderSrc 配置封面地址
   * @param {int} comicId 漫画id
   * @returns {String} 返回格式化后的地址
   */
  static String formatImgSrc(String placeholderSrc, int comicId,
      [String ratio = '']) {
    if (comicId != null) {
      String str = comicId.toString() + ratio;
      return placeholderSrc.replaceAll('{0}', str);
    } else {
      return null;
    }
  }

  /**
   * @function getPathById 根据数字id生成文件路径，补齐至9位后每3位数字一级目录]
   * @param  {int} id 漫画id
   * @param  {String} sep 分割符
   * @return {String} 例如：id为12345，则文件路径为000/012/345
   */
  static String getPathById(int id, [sep = '/']) {
    String str;
    if (id > 0) {
      str = id.toString();
    } else {
      return '000${sep}000${sep}000';
    }
    var rs, row, col, i, j, len = str.length;

    for (i = 9 - len; i > 0; i--) {
      str = '0' + str;
    }
    len = str.length;
    row = (len / 3).floor();
    col = len % 3;
    rs = str.substring(0, col);
    i = 0;
    for (j = col; i < row; i++, j = 3 * i + col) {
      rs += (i == 0 && col == 0 ? '' : sep) + str.substring(j, j + 3);
    }
    return rs;
  }

  /**
   * 根据数字id生成文件路径，补齐至9位后每3位数字一级目录
   * 例如：id为12345，则文件路径为000/012/345
   **/
  static String getDirById(int id) {
    String idStr = id.toString();
    int resLen = 9 - idStr.length;
    String resStr = '';
    for (var i = 0; i < resLen; i++) {
      resStr += '0';
    }
    resStr = resStr + idStr;
    int index = 0;
    return resStr.replaceAllMapped(RegExp(r'(.{3})'), (match) {
      index++;
      return '${match.group(0)}${index == 3 ? '' : '/'}';
    });
  }

  /// 根据用户id生成头像
  static String getUserId(int id) {
    String idStr = getDirById(id);
    return 'https://head.3456mh.com/quanmian/user_head/${idStr}.jpg-100x100';
  }
}
